#include "editeur.h"

void afficher_fiches(Fiche* fiches)
{
    static int espace = 0;
    if(fiches != NULL)
    {
        int i;
        for(i=0;i<espace; i++)
            printf(" ");
        printf("%d:%d %s\n", fiches->quest,fiches->etape, fiches->label);
        espace++;
        afficher_fiches(fiches->secondaire);
        espace--;
        afficher_fiches(fiches->suivant);
    }
}

void afficher_fiche(Fiche* fiche)
{
    printf("%d:%d %s\n", fiche->quest,fiche->etape, fiche->label);
    printf("         ***\n");
    printf("Description :\n");
    printf("%s\n", fiche->description);
    printf("         ***\n");
    printf("Objectif :\n");
    printf("%s\n", fiche->objectif);
    printf("         ***\n");
    printf("Recompense(s) :\n");
    printf("%s\n", fiche->recompense);
    printf("-------------------------------\n\n");
}

void afficher_menu()
{
    printf("1 - Voir etape\n");
    printf("2 - Modifier etape\n");
    printf("3 - Ajout\n");
    printf("4 - Suppression\n");
    printf("5 - Sauvegarde\n");
    printf("6 - Chargement\n");
    printf("7 - Exit\n");
    printf("\n");
}

void editer_fiche(Fiche* fiche)
{
    // On fait parametre par parametre
    modifier_une_entree(fiche->label, "label", TAILLE_STRING_LABEL);
    modifier_une_entree(fiche->description, "description", TAILLE_STRING_DESCRIPTION);
    modifier_une_entree(fiche->objectif, "objectif", TAILLE_STRING_OBJECTIF);
    modifier_une_entree(fiche->recompense, "recompense", TAILLE_STRING_RECOMPENSE);
}

void modifier_une_entree(char* entree, const char* nom_entree, int taille)
{
    char reponse = 0;
    while(reponse != 'n' && reponse != 'N' && reponse != 'o' && reponse != 'O')
    {
        printf("Modifier le/la/les %s ? (o|n) : ", nom_entree);
        scanf("%c%*[^\n]", &reponse);
        getchar();
    }
    if(reponse == 'o' || reponse =='O')
    {
        char entree_scanf[20] ={0};
        sprintf(entree_scanf, "%%%ds%%*[^\n]", taille);
        scanf(entree_scanf, entree);
        getchar();
    }
}

void sauvegarder_fiches(FILE* fichier, Fiche* fiches)
{
    if(fiches != NULL)
    {
        fputs("<QUETE>\n", fichier);

        while(fiches != NULL)
        {
            // On entre le balisage d une fiche
            fputs("<FICHE>\n", fichier);
            sauver_fiche(fichier, fiches);
            sauvegarder_fiches(fichier, fiches->secondaire);
            fputs("</FICHE>\n", fichier);
            fiches = fiches->suivant;
        }

        fputs("</QUETE>\n", fichier);
    }
}

void sauver_fiche(FILE* fichier, Fiche* fiche)
{
    // On entre les donnees
    fprintf(fichier, "<NQUETE>%d</NQUETE>\n", fiche->quest);
    fprintf(fichier, "<NETAPE>%d</NETAPE>\n", fiche->etape);
    fprintf(fichier, "<LABEL>%s</LABEL>\n", fiche->label);
    fprintf(fichier, "<DESCRIPTION>%s</DESCRIPTION>\n", fiche->description);
    fprintf(fichier, "<OBJECTIF>%s</OBJECTIF>\n", fiche->objectif);
    fprintf(fichier, "<RECOMPENSE>%s</RECOMPENSE>\n", fiche->recompense);
}

// Les actions
void voir_fiche(Fiche* fiches)
{
    printf("Affichage des details d'une etape\n");
    // On demande quelle fiche on veut voir
    int quest=-1,etape=-1;
    Fiche* fiche = NULL;
    while(fiche == NULL)
    {
        printf("Voir quelle quete ? (-1 pour annuler) ");
        scanf("%d%*[^\n]", &quest);
        getchar();
        if(quest == -1)
            break;
        printf("Voir quelle etape ? (-1 pour annuler) ");
        scanf("%d%*[^\n]", &etape);
        getchar();
        if(etape == -1)
            break;
        fiche = get_fiche(fiches, quest, etape);
    }
    afficher_fiche(fiche);
}

void modifier_fiche(Fiche* fiches)
{
    printf("Modification d'une etape\n");
    // On demande quelle fiche on veut modifier
    int quest=-1,etape=-1;
    Fiche* fiche = NULL;
    while(fiche == NULL)
    {
        printf("Modifier quelle quete ? (-1 pour annuler) ");
        scanf("%d%*[^\n]", &quest);
        getchar();
        if(quest == -1)
            break;
        printf("Modifier quelle etape ? (-1 pour annuler) ");
        scanf("%d%*[^\n]", &etape);
        getchar();
        if(etape == -1)
            break;
        fiche = get_fiche(fiches, quest, etape);
    }
    if(fiche != NULL)
        editer_fiche(fiche);
}

void ajouter(Fiche** fiches)
{
    printf("Ajout d'une etape\n");
    // On cree une nouvelle fiche
    Fiche* nouv = nouvelle_fiche();
    editer_fiche(nouv);

    // Notre fiche est complete, on demande ou on l'ajoute
    int methode_ajout = -1;
    char reponse = 0;
    while(reponse != 'n' && reponse != 'N' && reponse != 'o' && reponse != 'O')
    {
        printf("Ajouter en tant que nouvelle quete ? (o|n) ");
        scanf("%c%*[^\n]", &reponse);
        getchar();
    }

    if(reponse == 'O' ||reponse == 'o')
    {
        methode_ajout = 0;
    }
    else
    {
        reponse = 0;
        while(reponse != 'n' && reponse != 'N' && reponse != 'o' && reponse != 'O')
        {
            printf("Ajouter avant ou apres une etape ? (o -> avant | n -> apres) ");
            scanf("%c%*[^\n]", &reponse);
            getchar();
        }
        if(reponse == 'O' ||reponse == 'o')
        {
            methode_ajout = 1;
        }
        else
        {
            methode_ajout = 2;
        }
    }

    // On demande ou on veut l'ajouter
    int quest=-1,etape=-1;
    int retour = 0;
    while(!retour)
    {
        switch(methode_ajout)
        {
            case 0 : printf("Sous quelle quete ? (-1 pour annuler) "); break;
            case 1 : case 2 : printf("Dans quelle quete ? (-1 pour annuler) "); break;
            default : printf("Erreur de saisie"); break;

        }
        scanf("%d%*[^\n]", &quest);
        getchar();
        if(quest == -1)
            break;
        switch(methode_ajout)
        {
            case 0 : printf("Sous quelle etape ? (-1 pour annuler) "); break;
            case 1 : printf("Avant quelle etape ? (-1 pour annuler) "); break;
            case 2 : printf("Apres quelle etape ? (-1 pour annuler) "); break;
            default : printf("Erreur de saisie"); break;

        }
        scanf("%d%*[^\n]", &etape);
        getchar();
        if(etape == -1)
            break;
        switch(methode_ajout)
        {
            case 0 : retour = ajouter_quete_secondaire_by_id(*fiches, quest, etape, nouv); break;
            case 1 : retour = ajouter_etape_avant_by_id(fiches, quest, etape, nouv); break;
            case 2 : retour = ajouter_etape_apres_by_id(*fiches, quest, etape, nouv);  break;
            default : retour = 1; break;
        }
    }
    if(retour == 0)
        supprimer_fiche(nouv);
}

void supprimer(Fiche** fiches)
{
    printf("Suppression\n");
    // Soit on supprime tout une quete, soit uniquement une etape
    printf("Supprimer une quete ou une etape ? (o -> quete | n -> etape)");
    char reponse = 0;
    scanf("%c%*[^\n]", &reponse);
    getchar();
    if(reponse == 'o' || reponse == 'O')
    {
        int quete = -2;
        int retour = 0;
        while(retour == 0)
        {
            // On supprime toute une quete
            printf("Quelle quete voulez-vous supprimer ? (-1 pour annuler)\n");
            scanf("%d%*[^\n]", &quete);
            getchar();
            if(quete == -1)
                break;
            retour = supprimer_quete_by_id(*fiches, quete);
        }
    }
    else
    {
        int quete = -2;
        int etape = -2;
        int retour = 0;
        while(retour == 0)
        {
            // On supprime une etape
            printf("L'etape de quelle quete voulez-vous supprimer ? (-1 pour annuler)\n");
            scanf("%d%*[^\n]", &quete);
            getchar();
            if(quete == -1)
                break;
            printf("Quelle etape voulez-vous supprimer ? (-1 pour annuler)\n");
            scanf("%d%*[^\n]", &etape);
            getchar();
            if(etape == -1)
                break;

            retour = supprimer_fiche_by_id(fiches, quete, etape);
        }
    }
}

void save(Fiche* fiches)
{
    printf("Sauvegarde d'un fichier\n");

    // On demande le nom dans lequel on sauvegarde
    static char fichier_sauvegarde[50] = {0};

    int changement_nom_fichier = 1;
    if(fichier_sauvegarde[0] != 0)
    {
        char reponse = 0;
        while(reponse != 'n' && reponse != 'N' && reponse != 'o' && reponse != 'O')
        {
            printf("L'emplacement actuel de sauvegarde est : %s\n Voulez-vous changer cet emplacement ? (o|n)\n", fichier_sauvegarde);
            scanf("%c%*[^\n]", &reponse);
            getchar();
        }
        changement_nom_fichier = (reponse == 'o' || reponse == 'O');
    }

    FILE* fichier = NULL;
    if(changement_nom_fichier)
    {
        while(fichier == NULL)
        {
            printf("Entrez le nom du fichier :\n");
            scanf("%50s%*[^\n]", fichier_sauvegarde);
            getchar();

            fichier = fopen(fichier_sauvegarde, "w");
        }
    }
    else
    {
         fichier = fopen(fichier_sauvegarde, "w");
    }
    // Le fichier est normalement ouvert

    sauvegarder_fiches(fichier, fiches);


    fclose(fichier);
}

void load(Fiche* fiches)
{
    printf("Chargement d'un fichier\n");

    char fichier_sauvegarde[50] = {0};

    FILE* fichier = NULL;
    while(fichier == NULL)
    {
        printf("Entrez le nom du fichier :\n");
        scanf("%50s%*[^\n]", fichier_sauvegarde);
        getchar();

        fichier = fopen(fichier_sauvegarde, "w");
    }



    fclose(fichier);
}

int menu(Fiche** fiches)
{
    afficher_fiches(*fiches);
    printf("\n");

    int entree = -1;
    while(entree < 1 || entree > 7)
    {
        printf("\n");
        afficher_menu();
        printf("Choix ?\n");
        scanf("%d%*[^\n]", &entree);
        getchar();
    }

    switch(entree)
    {
        case 1 : voir_fiche(*fiches); return 1;
        case 2 : modifier_fiche(*fiches); return 1;
        case 3 : ajouter(fiches); return 1;
        case 4 : supprimer(fiches); return 1;
        case 5 : save(*fiches); return 1;
        case 6 : load(*fiches); return 1;
        default : return 0;
    }
}
